package com.example.dao;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.dao.entityintf.EntityInterface;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述
 * 权限目录实体类
 * @author: jimmy
 * @date: 2023年12月18日 21:02
 */
@Data
@TableName("sys_permissions")
public class Permission implements Comparable<Permission> , EntityInterface {
    /**
     * 自增长 ID，唯一标识
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 父目录id
     */
    private Long pid;

    /**
     * 权限名称
     */
    @Size(min=1,max = 20, message = "{Size.permission.permissionName}")
    @TableField("permission_name")
    private String permissionName;

    /**
     * 显示名称
     */
    @NotNull
    @Size(min=1,max = 20, message = "{Size.permission.displayName}")
    @TableField("display_name")
    private String displayName;

    /**
     * 描述
     */
    @Size(min=1,max = 20, message = "{Size.permission.description}")
    private String description;

    /**
     * 权限匹配字符串
     */
    @Size(max = 50, message = "{Size.permission.patchString}")
    @TableField("patchString")
    private String patchString;

    /**
     * 是否在菜单中显示
     */
    @TableField("menuFlag")
    private boolean menuFlag;

    /**
     * 同级目录排序
     */
    @TableField("orderNumber")
    private Integer orderNumber;

    /**
     * 操作属性,查看是必须的，0只有查看权限，1增加，2修改，
     * 4删除，3增加修改，5增加删除，6修改删除，7增加修改删除
     */
    @TableField(exist = false)
    private Integer operation;

    /**
     * 子目录列表
     */
    @TableField(exist = false)
    private List<Permission> children = new ArrayList<>();

    @Override
    public int compareTo(Permission o) {
        int sum = this.orderNumber - o.orderNumber;
        return sum;
    }

    @Override
    public Long getKey() {
        return id;
    }

    @Override
    public int hashCode(){
        return (this.id+this.permissionName).hashCode();
    }
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Permission) {
            Permission permission = (Permission) obj;
            return (permission.id==this.id)&&permission.permissionName.equals(this.permissionName);
        }
        return super.equals(obj);
    }

    @Override
    public String toString(){
        return orderNumber.toString();
    }
}
